# 导入必要的类型提示、抽象基类和其他依赖
from typing import Tuple, Dict, Any, Callable
from abc import ABCMeta, abstractmethod

import torch
from ..data.calculator import AlphaCalculator
from ..data.expression import Expression


class AlphaPoolBase(metaclass=ABCMeta):
    """Alpha因子池的基类，用于管理和评估多个Alpha因子"""
    def __init__(
        self,
        capacity: int,            # 因子池的最大容量
        calculator: AlphaCalculator,  # 用于计算Alpha因子的计算器
        device: torch.device = torch.device("cpu")  # 计算设备，默认使用CPU
    ):
        self.size = 0            # 当前池中的因子数量
        self.capacity = capacity  # 池的最大容量
        self.calculator = calculator  # Alpha因子计算器实例
        self.device = device     # 计算设备
        self.eval_cnt = 0        # 评估计数器
        self.best_ic_ret: float = -1.   # 最佳IC收益率

    @property
    def vacancy(self) -> int:
        """返回池中剩余的空位数量"""
        return self.capacity - self.size
    
    @property
    @abstractmethod
    def state(self) -> Dict[str, Any]:
        """获取表示池当前状态的字典
        Returns:
            Dict[str, Any]: 包含池状态信息的字典
        """

    @abstractmethod
    def to_json_dict(self) -> Dict[str, Any]:
        """将池序列化为可以转换为JSON的字典格式
        
        Returns:
            Dict[str, Any]: 不包含复杂对象的字典，可直接转换为JSON
        """

    @abstractmethod
    def try_new_expr(self, expr: Expression) -> float:
        """尝试评估新的表达式（因子）
        
        Args:
            expr (Expression): 待评估的表达式
            
        Returns:
            float: 评估得分
        """

    @abstractmethod
    def test_ensemble(self, calculator: AlphaCalculator) -> Tuple[float, float]:
        """测试因子组合的效果
        
        Args:
            calculator (AlphaCalculator): 用于测试的计算器
            
        Returns:
            Tuple[float, float]: 返回评估结果，包含两个指标
        """
